home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d20 / pvert.arc / XQWK.C < prev    next >
Text File  |  1992-01-15  |  10KB  |  400 lines

  1. /*
  2.  * Basic XBBS-specific QWK functions in C
  3.  *
  4.  */
  5.  
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <time.h>
  10. #include "qwk.h"
  11. #include "xmsg.h"
  12. #include "addr.h"
  13. #ifdef BMG
  14.  #include "bmg.h"
  15. #endif
  16.  
  17. #ifdef HEADEDIT
  18.     extern char to_domain[39],from_domain[39];
  19. #endif
  20.  
  21. #ifdef GUESSREST
  22.     extern ADDR *myaddr;
  23. #endif
  24.  
  25. extern char *  rstrip (char *);
  26. extern char *  skip_white (char *p);
  27. extern char *  write_line (char **text,unsigned int linelen,char ctla);
  28.  
  29.  
  30.  
  31. #ifdef XQWKIMPORT
  32.  
  33.  
  34. QWKAREAS * xreadqwkmsg (FILE *fp,XMSG *msg,char **hold,QWKAREAS *head,
  35.                         int *error,int rep) {
  36.  
  37.     /* import a QWK message into an XBBS msg.  note that default
  38.      * addresses should be assigned before calling this, as there's
  39.      * no guarantee a valid address will be obtainable from the
  40.      * damned QWK message.  Also note that message text will be
  41.      * allocated here, and must be freed by caller
  42.      */
  43.  
  44.     QWKHDR    hdr;
  45.     time_t    t;
  46.     struct tm *tm;
  47.     long      size,pos;
  48.     QWKAREAS *info;
  49.     char     *p,*origin,*msgid,*msgto;
  50.  
  51.  
  52.     *hold = NULL;
  53.     *error = MSG_NOERR;
  54. #ifdef HEADEDIT
  55.     *from_domain = *to_domain = 0;
  56. #endif
  57.  
  58.     /* get header */
  59.  
  60.     if(!qwkreadhdr(fp,&hdr,rep)) {
  61.         *error = MSG_NOMOREMSGS;    /* end of the line */
  62.         return NULL;
  63.     }
  64.     pos = ftell(fp);
  65.  
  66.     msg->attr = msg->m_attr = 0;
  67.     if(!hdr.live) msg->m_attr |= MSGDELETED;
  68.     if(hdr.status == QWKPRIVATE) msg->attr |= MSGPRIVATE;
  69.     strcpy(msg->from,hdr.from);
  70.     strcpy(msg->to,hdr.to);
  71.     strcpy(msg->subj,hdr.subj);
  72.     strftime(msg->date,20,"%a %d %b %y %H:%M",localtime(&hdr.date));
  73.     t = time(NULL);
  74.     tm = localtime(&t);
  75.     msg->indate[0] = (char)(tm->tm_year - 89);
  76.     msg->indate[1] = (char)(tm->tm_mon + 1);
  77.     msg->indate[2] = (char)tm->tm_mday;
  78.     msg->indate[3] = 0;
  79.     msg->times = 0;
  80.     msg->up    = 0;
  81.     msg->dn    = 0;
  82.     msg->cost  = 0;
  83.  
  84.     /* now get text */
  85.  
  86.     size = hdr.numchunks * (long)QWKBLKSIZE;
  87.     if(!size) {
  88.         *error = MSG_NOTEXT;    /* possible? */
  89.         return NULL;
  90.     }
  91.     if(size > 65024L) size = 65024L;
  92.     *hold = malloc((size_t)(size + 1L));
  93.     if(!*hold) {
  94.         *error = MSG_NOMEM;     /* fatal */
  95.         return NULL;
  96.     }
  97.  
  98.     if(!qwkreadblks(fp,*hold,(size_t)(size / (long)QWKBLKSIZE))) {
  99.         free(*hold);
  100.         *hold = NULL;
  101.         fseek(fp,pos + (hdr.numchunks * (long)QWKBLKSIZE),SEEK_SET);
  102.         *error = MSG_NOTEXT;    /* maybe not fatal */
  103.         return NULL;
  104.     }
  105.     fseek(fp,pos + (hdr.numchunks * (long)QWKBLKSIZE),SEEK_SET);
  106.  
  107.     rstrip(*hold);
  108.     msg->length = strlen(*hold);
  109.  
  110.     /* "treat" the message */
  111.  
  112.     p = *hold;
  113.     while (*p) {
  114.       if(*p == '\x8d' || *p == '\n') {
  115.           memmove(p,&p[1],msg->length - ((unsigned int)p - (unsigned int)*hold));
  116.           msg->length--;
  117.           if(!msg->length) break;
  118.           continue;
  119.       }
  120.       else p++;
  121.     }
  122.     if(*(p - 1) != '\r' && p > *hold) {
  123.       *p = '\r';
  124.       p[1] = 0;
  125.     }
  126.  
  127.     if(!msg->length) {
  128.         free(*hold);
  129.         *hold = NULL;
  130.         *error = MSG_NOTEXT;    /* maybe not fatal */
  131.         return NULL;
  132.     }
  133.  
  134.     /* find the damned area it belongs to */
  135.  
  136.     info = head;
  137.     while(info) {
  138.         if(hdr.confnum == info->confnum) break;
  139.         info = info->next;
  140.     }
  141.     if(!info) {
  142.         free(*hold);
  143.         *hold = NULL;
  144.         *error = MSG_BADAREA;   /* not fatal */
  145.         return NULL;
  146.     }
  147.  
  148.     /* now the hard part; trying to dig an address out of this
  149.        addressless bastard... */
  150.  
  151. #ifdef BMG
  152.     origin = bmgStrstr("\r * Origin: ",*hold,0);
  153.     while((p = bmgStrstr("\r * Origin: ",&origin[1],0)) != NULL)
  154.       origin = p;
  155.     msgid = bmgStrstr("\01MSGID: ",*hold,0);
  156.     msgto = bmgStrstr("\01MSGTO: ",*hold,0);
  157. #else
  158.     origin = strstr(*hold,"\r * Origin: ");
  159.     while((p = strstr(&origin[1],"\r * Origin: ")) != NULL) origin = p;
  160.     msgid = strstr(*hold,"\01MSGID: ");
  161.     msgto = strstr(*hold,"\01MSGTO: ");
  162. #endif
  163.  
  164.     if(msgid) {
  165.         p = msgid;
  166.         if((p - 1) < *hold || *(p - 1) == '\r') {
  167.  
  168.             ADDR addr;
  169.  
  170.             addr.domain = NULL;
  171.             addr.net = msg->orig_net;
  172.             addr.node = msg->orig;
  173.             addr.point = msg->o_point;
  174.             addr.zone = msg->o_zone;
  175.             p += 8;
  176.             p = skip_white(p);
  177.  
  178.             if(!parse_addr(&p,&addr,NULL)) {
  179. #ifdef GUESSREST
  180.                 if(!addr.zone || !addr.net || !addr.domain || !*addr.domain) {
  181.                     guess_rest(&addr,myaddr);
  182.                 }
  183. #endif
  184.             }
  185.             msg->o_zone   = addr.zone;
  186.             msg->orig_net = addr.net;
  187.             msg->orig     = addr.node;
  188.             msg->o_point  = addr.point;
  189. #ifdef HEADEDIT
  190.             if(addr.domain) strncpy(from_domain,addr.domain,38);
  191.             from_domain[38] = 0;
  192.             p = strchr(from_domain,'.');
  193.             if(p) *p = 0;
  194.             if(addr.domain) free(addr.domain);
  195. #endif
  196.         }
  197.         else msgid = NULL;
  198.     }
  199.  
  200.     if(msgto) {
  201.         p = msgto;
  202.         if((p - 1) < *hold || *(p - 1) == '\r') {
  203.  
  204.             ADDR addr;
  205.  
  206.             addr.domain = NULL;
  207.             addr.net = msg->dest_net;
  208.             addr.node = msg->dest;
  209.             addr.point = msg->d_point;
  210.             addr.zone = msg->d_zone;
  211.             p += 8;
  212.             p = skip_white(p);
  213.  
  214.             if(!parse_addr(&p,&addr,NULL)) {
  215. #ifdef GUESSREST
  216.                 if(!addr.zone || !addr.net || !addr.domain || !*addr.domain) {
  217.                     guess_rest(&addr,myaddr);
  218.                 }
  219. #endif
  220.             }
  221.             msg->d_zone   = addr.zone;
  222.             msg->dest_net = addr.net;
  223.             msg->dest     = addr.node;
  224.             msg->d_point  = addr.point;
  225. #ifdef HEADEDIT
  226.             if(addr.domain) strncpy(to_domain,addr.domain,38);
  227.             to_domain[38] = 0;
  228.             p = strchr(to_domain,'.');
  229.             if(p) *p = 0;
  230.             if(addr.domain) free(addr.domain);
  231. #endif
  232.         }
  233.         else msgto = NULL;
  234.     }
  235.  
  236.     if(origin && !msgid) {
  237.  
  238.         ADDR addr;
  239.         char temp,*tempo;
  240.  
  241.         tempo = strchr(&origin[1],'\r');
  242.         if(!tempo) {
  243.             tempo = strrchr(origin,')');
  244.             if(tempo) tempo++;
  245.         }
  246.         if(tempo) {
  247.             while(*tempo != '(' && tempo > origin + 10) {
  248.                 tempo--;
  249.             }
  250.             if(*tempo == '(') {
  251.                 addr.net = msg->orig_net;
  252.                 addr.node = msg->orig;
  253.                 addr.point = msg->o_point;
  254.                 addr.zone = msg->o_zone;
  255.                 addr.domain = NULL;
  256.                 p = tempo + 1;
  257.                 while(*tempo && *tempo != '\r' && *tempo != ')') tempo++;
  258.                 temp = *tempo;
  259.                 *tempo = 0;
  260.                 if(!parse_addr(&p,&addr,NULL)) {
  261. #ifdef GUESSREST
  262.                     if(!addr.zone || !addr.net || !addr.domain || !*addr.domain) {
  263.                         guess_rest(&addr,myaddr);
  264.                     }
  265. #endif
  266.                 }
  267.                 msg->o_zone   = addr.zone;
  268.                 msg->orig_net = addr.net;
  269.                 msg->orig     = addr.node;
  270.                 msg->o_point  = addr.point;
  271. #ifdef HEADEDIT
  272.                 if(addr.domain && addr.domain)
  273.                   strncpy(from_domain,addr.domain,38);
  274.                 from_domain[38] = 0;
  275.                 p = strchr(from_domain,'.');
  276.                 if(p) *p = 0;
  277.                 if(addr.domain) free(addr.domain);
  278. #endif
  279.                 *tempo = temp;
  280.             }
  281.         }
  282.     }
  283.  
  284.     return info;
  285. }
  286.  
  287.  
  288. #endif
  289.  
  290.  
  291.  
  292. #ifdef XQWKEXPORT
  293.  
  294. int xwriteqwkmsg (FILE *fp,FILE *idx,XMSG *msg,char *hold,long msgnum,
  295.                   int area,int rep) {
  296.  
  297.     /* export an XBBS msg as a QWK msg */
  298.  
  299.     QWKHDR hdr;
  300.     long   pos;
  301.     char   *p;
  302. #ifndef NEVER
  303.     char         *ln;
  304.     unsigned int len,w;
  305.     long         bpos;
  306. #endif
  307. #ifdef USEFLOATS
  308.     QWKIDX i;
  309. #endif
  310.  
  311.  
  312.     pos = ftell(fp);
  313.     strncpy(hdr.from,msg->from,25);
  314.     strncpy(hdr.to,msg->to,25);
  315.     strncpy(hdr.subj,msg->subj,25);
  316.     hdr.subj[25] = hdr.to[25] = hdr.from[25] = 0;
  317.     if(msg->attr & MSGPRIVATE) hdr.status = QWKPRIVATE;
  318.     else hdr.status = QWKPUBUNREAD;
  319.     hdr.msgnum = msgnum;
  320.     hdr.confnum = area;
  321.     hdr.date = time(NULL);
  322.     *hdr.pword = 0;
  323.     hdr.repnum = 0;
  324.     hdr.numchunks = (long)(msg->length / QWKBLKSIZE) + ((msg->length % QWKBLKSIZE) != 0);
  325.     hdr.live = 1;
  326.  
  327.     if(!qwkwritehdr(fp,&hdr,rep)) {
  328.         return MSG_BADWRITE;
  329.     }
  330.  
  331.     if(!(msg->m_attr & MSGTREATED)) {    /* "treat" the message */
  332.         p = hold;
  333.         while (*p) {
  334.           if(*p == '\x8d' || *p == '\n') {
  335.               memmove(p,&p[1],msg->length - ((unsigned int)p - (unsigned int)hold));
  336.               msg->length--;
  337.               if(!msg->length) break;
  338.               continue;
  339.           }
  340.           else p++;
  341.         }
  342.         if(*(p - 1) != '\r' && p > hold) {
  343.           *p = '\r';
  344.           p[1] = 0;
  345.         }
  346.     }
  347.  
  348. #ifdef NEVER
  349.  
  350.     /* this simple method won't work; damn QWK readers don't understand
  351.        Fidonet-style paragraphing.  slows things down considerably. */
  352.  
  353.     if(!qwkwriteblks(fp,hold)) {
  354.         fseek(fp,pos,SEEK_SET);
  355.         fwrite("",0,0,fp); /* truncate file? */
  356.         return MSG_BADWRITE;
  357.     }
  358.  
  359. #endif
  360.  
  361. #ifndef NEVER
  362.  
  363.     p = hold;
  364.     len = 0;
  365.     while(p && *p) {
  366.         ln = write_line(&p,76,1);
  367.         len += fprintf(fp,"%s\xe3",ln);
  368.     }
  369.  
  370.     /* fill out last block w/ spaces */
  371.  
  372.     hdr.numchunks = (long)((len / QWKBLKSIZE) + ((len % QWKBLKSIZE) != 0));
  373.     w = ((unsigned int)hdr.numchunks * QWKBLKSIZE) - len;
  374.     while(w--) {
  375.         fputc(' ',fp);
  376.     }
  377.  
  378.     /* backtrack and rewrite header */
  379.  
  380.     bpos = ftell(fp);
  381.     fseek(fp,pos,SEEK_SET);
  382.     qwkwritehdr(fp,&hdr,rep);
  383.     fseek(fp,bpos,SEEK_SET);
  384.  
  385. #endif
  386.  
  387. #ifdef USEFLOATS
  388.     if(!rep) {
  389.         i->recnum = (float)(pos / (long)QWKBLKSIZE);
  390.         i->junk = (char)area;
  391.         qwkwriteidx(idx,&i);
  392.     }
  393. #endif
  394.  
  395.     msg->m_attr |= MSGQSCAN;
  396.     return MSG_NOERR;
  397. }
  398.  
  399. #endif
  400.